package org.example.cicdi.service.impl.second;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.extern.slf4j.Slf4j;

import org.example.cicdi.enums.EnumWhiteColumnAnnotation;
import org.example.codegenerate.modelext.WebVo.Enum.EnumJavaMappingDbType;
import org.example.codegenerate.modelext.WebVo.domian.column.ColumnVoDomain;
import org.example.codegenerate.modelext.WebVo.domian.column.DbVo;
import org.example.codegenerate.modelext.WebVo.domian.table.WebModelVo;
import org.springframework.stereotype.Service;

import javax.persistence.Column;
import javax.persistence.Id;
import java.lang.reflect.Field;
import java.util.List;

@Service
@Slf4j
public class ColumnVoAnnotatonImpleServiceSecond implements FieldAnnotationServiceSecond {

	@Override
	public String getCode() {
		return EnumWhiteColumnAnnotation.Column.getCode();
	}

	/*@Override
	public ColumnVoDomain handleFieldVo(Field field, ColumnVoDomain column, TableVoDomain tableVoDomain, List<WebModelVo> webModelVoList) {
		DbVo db = column.getDbVo();
		if (db == null) {
			db = new DbVo();
			column.setDbVo(db);
		}

		if (field.getAnnotation(Column.class) != null) {
			Column vo = field.getAnnotation(Column.class);
			db.setDbDefaultVal(null); //如果这里要实现的话，需要单独开个方法：jpa对象->class.newInstance()->反射获取字段值
			if(vo.name().length()>1) {
				db.setDbFieldName(vo.name());
			}else {
				db.setDbFieldName(field.getName());
			}

			String comment = vo.columnDefinition().toLowerCase();
			if (StringUtils.isNotBlank(comment)) {
				db.setDbFieldTxt(comment.substring(comment.indexOf("'") + 1, comment.length() - 1));
			}else {
				db.setDbFieldTxt("");
			}

			//db.setDbIsKey(vo.unique() ? 1 : 0);
			if(field.getAnnotation(Id.class) != null){
				db.setDbIsKey(1);
				db.setDbIsNull(0);
			}else {
				db.setDbIsKey(0);
				db.setDbIsNull(vo.nullable() ? 1 : 0);
			}

			db.setDbLength(vo.length());
			db.setDbPointLength(vo.precision());

			//setFieldDbType(field,vo,db);
			setFieldDbTypeExt(field,vo,db);
			db.setDbPointLength(vo.scale());

			//special设置，没有从注解上进行设置
			db.setDbDefaultVal(null);
			db.setValidateVo(null);

			//db.setFieldName(oConvertUtils.camelName(db.getDbFieldName()));
			db.setFieldName(db.getDbFieldName());
			//db.setFieldType(new OnlCgformHeadService10Impl().getWrapper(db.getDbType()));
			db.setFieldType(AuxHelper.getWrapper(db.getDbType()));

			column.setDbVo(db);
		}

		return column;
	}*/

	private void setFieldDbType(Field field, Column vo, DbVo db) {
		if(field.getType().getSimpleName().equalsIgnoreCase("Date")
				||field.getType().getSimpleName().equalsIgnoreCase("BigDecimal")
				||field.getType().getSimpleName().equalsIgnoreCase("String")) {
			db.setDbType(field.getType().getSimpleName());
			if(vo.columnDefinition().toLowerCase().contains("text")){//处理一下Text类型的问题
				db.setDbType("Text");
			}
		}else {
			db.setDbType(field.getType().getSimpleName().toLowerCase());
		}
	}


	private void setFieldDbTypeExt(Field field, Column vo, DbVo db) {
		//如果columnDefinition，不是采用默认值。因为默认值就是""，如果写错了，JPA在实例化的时候，就提示了
		log.info("当前正常处理的Column:{}",vo.name());
		if(vo.name()=="contents"){
			int i=1;
		}
		EnumJavaMappingDbType enumJavaMappingDbType;
		if(!vo.columnDefinition().equalsIgnoreCase("")){
			enumJavaMappingDbType = EnumJavaMappingDbType.getBycolumnDefinition(vo.columnDefinition());
			//assert 布尔表达式 ：“错误信息提示”；
			assert enumJavaMappingDbType !=null :"Column注解中字段的类型不在系统的支持范围之内，当前系统仅支持8种类型,varchar,text,blob,date,datetime,decimal,int,double";
			if(field.getName().contains("chucDate")){
				int j=2;
			}
			log.info("当前正常处理的字段类型：{}，字段的名称为{}",enumJavaMappingDbType,field.getName(),enumJavaMappingDbType.getDbname());
			/*//先特殊处理一下，针对DateTime的，全部转为Date
			if(enumJavaMappingDbType.getDbname().equalsIgnoreCase("datetime")){
				db.setDbType("date");
			}*/
		}else {
			//如果有Column，但是在这个上面没有columnDefinition，那么就采用默认的字段类型。但是字段类型必须在6种之内，String，Date，Decimal，Integer，Double
			enumJavaMappingDbType = EnumJavaMappingDbType.getByDbJavaTypeName(field.getType().getSimpleName());
			assert enumJavaMappingDbType !=null :"Java中定义的字段的类型不在系统的支持范围之内，当前系统仅支持6种Java类型,String," +
					"Date,BigDecimal,Integer,Double";
		}
		db.setDbType(enumJavaMappingDbType.getCurrentFrameWorkNeededDbType());

	}

	//这个方法中传入了WebModelVo，及WebModelVoList没有作用
	public ColumnVoDomain handleFieldVo(Field field, ColumnVoDomain column, WebModelVo webModelVo, List<WebModelVo> webModelVoList){
		DbVo db = column.getDbVo();
		if (db == null) {
			db = new DbVo();
			column.setDbVo(db);
		}

		if (field.getAnnotation(Column.class) != null) {
			Column vo = field.getAnnotation(Column.class);
			db.setDbDefaultVal(null); //如果这里要实现的话，需要单独开个方法：jpa对象->class.newInstance()->反射获取字段值
			if(vo.name().length()>1) {
				db.setDbFieldName(vo.name());
			}else {
				db.setDbFieldName(field.getName());
			}

			String comment = vo.columnDefinition().toLowerCase();
			if (StringUtils.isNotBlank(comment)) {
				db.setDbFieldTxt(comment.substring(comment.indexOf("'") + 1, comment.length() - 1));
			}else {
				db.setDbFieldTxt("");
			}

			//db.setDbIsKey(vo.unique() ? 1 : 0);
			if(field.getAnnotation(Id.class) != null){
				db.setDbIsKey(1);
				db.setDbIsNull(0);
			}else {
				db.setDbIsKey(0);
				db.setDbIsNull(vo.nullable() ? 1 : 0);
			}

			db.setDbLength(vo.length());
			db.setDbPointLength(vo.precision());

			//setFieldDbType(field,vo,db);
			setFieldDbTypeExt(field,vo,db);
			db.setDbPointLength(vo.scale());

			//special设置，没有从注解上进行设置
			db.setDbDefaultVal(null);
			db.setValidateVo(null);

			//db.setFieldName(oConvertUtils.camelName(db.getDbFieldName()));
			db.setFieldName(db.getDbFieldName());
			//db.setFieldType(new OnlCgformHeadService10Impl().getWrapper(db.getDbType()));
			db.setFieldType(AuxHelper.getWrapper(db.getDbType()));

			column.setDbVo(db);
		}

		return column;
	}
}
